﻿Imports System
Imports System.Text
Imports System.Collections.Generic
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports Spring.Objects.Factory.Xml
Imports Babok
Imports FrameworkTeste

<TestClass()> Public Class CargaBabokTeste
    Inherits TesteTransacionalInjecaoDependenciaSpring

#Region " ConfigLocations "

    Protected Overrides ReadOnly Property ConfigLocations() As String()
        Get
            NamespaceParserRegistry.RegisterParser(GetType(Spring.Data.Config.DatabaseNamespaceParser))
            Return New [String]() {"assembly://Teste.Babok/Teste.Babok/AutoWired.xml"}
        End Get
    End Property

#End Region

    Private testContextInstance As TestContext
    '''<summary>
    '''Gets or sets the test context which provides
    '''information about and functionality for the current test run.
    '''</summary>
    Public Property TestContext() As TestContext
        Get
            Return testContextInstance
        End Get
        Set(ByVal value As TestContext)
            testContextInstance = value
        End Set
    End Property

#Region "Additional test attributes"
    '
    ' You can use the following additional attributes as you write your tests:
    '
    ' Use ClassInitialize to run code before running the first test in the class
    ' <ClassInitialize()> Public Shared Sub MyClassInitialize(ByVal testContext As TestContext)
    ' End Sub
    '
    ' Use ClassCleanup to run code after all tests in a class have run
    ' <ClassCleanup()> Public Shared Sub MyClassCleanup()
    ' End Sub
    '
    ' Use TestInitialize to run code before running each test
    '<TestInitialize()> Public Overloads Sub Initialize()
    '    MyBase.DefaultRollback = False
    '    MyBase.Initialize()
    'End Sub
    '
    ' Use TestCleanup to run code after each test has run
    ' <TestCleanup()> Public Sub MyTestCleanup()
    ' End Sub
    '
#End Region

#Region "Particoes de Equivalencia"

    'EXEMPLO: Public Const Particao_XXX as String = " Select CAMPO_X from TABELA_Y "

#End Region

#Region "Classes Injetadas"

    Private _particaoEquivalencia As ParticaoEquivalencia
    Public Property ParticaoEquivalencia() As ParticaoEquivalencia
        Get
            Throw New NotImplementedException("Nao esqueca de implementar o codigo abaixo")
            '_particaoEquivalencia = New ParticaoEquivalencia("UMA_CONNECTION_NAME")
            Return _particaoEquivalencia
        End Get
        Set(ByVal value As ParticaoEquivalencia)
            _particaoEquivalencia = value
        End Set
    End Property

#End Region

    <Priority(1)> _
    <TestMethod()> _
       Public Sub Start()
        Dim _item As ItemBackLog
        Dim _requisito As Requisito
        Dim _verificacao As Verificacao
        Dim _implementacao As Implementacao
        Dim _itemBackLog As ItemBackLog
        Dim _itemUI As ItemUI
        Dim _ui As UI

        'RASCUNHO04 RASCUNHO04 RASCUNHO04
        Dim _backlog As Backlog

        _backlog = New Backlog("Ferramentas Scrum", _
                               "Conjunto de ferramentas para prática do Scrum")

        _backlog.ItensPriorizados = New List(Of ItemPriorizado)

        _itemBackLog = New ItemBackLog With {.Titulo = "Cadastro de Análises e Verificações", _
                                             .EuComo = "Gestor de Qualidade", _
                                             .Quero = "Cadastrar análises e verificações", _
                                             .Para = "Garantir e controlar a qualidade do produto, evitar retrabalho e defeitos e gerar um fluxo de trabalho de verificações rastreável"}

        _itemBackLog.Requisitos = New List(Of Requisito)

        With _itemBackLog.Requisitos
            .Add(New Requisito("O modelo deve desacoplar a Verificação do que é Verificado"))
            .Add(New Requisito("Uma Verificação é uma ordem que transita por vários estados"))
            .Add(New Requisito("Verificar é o ato de analisar algo. As Análises devem ser destinadas a várias partes do sistema"))
            .Add(New Requisito("Podemos analisar Requisito, UI, Classe, Módulo, ItemBacklog, Cenário de Teste, Dúvidas"))
            .Add(New Requisito("Ao criar uma Verificação o Usuário deve ou Requisito, ou UI, ou Classe, ou Módulo, ou ItemBacklog, ou Cenário de Teste, ou Dúvidas"))
            .Add(New Requisito("Uma Verificação do tipo Descrição pode ser cadastrada para um ItemBacklog"))
            .Add(New Requisito("Uma Verificação pode ser Manual ou Automática"))
            .Add(New Requisito("Toda Verificação deve conter o Usuário que cadastrou e Data e Hora de Cadastro"))
            .Add(New Requisito("Toda Verificação deve conter além do Onde (Módulo, Item, Classe), o OQue (Verificar <Onde> se <OQue>. O ideal é <ResultadoEsperado>)"))
            .Add(New Requisito("A Verificação pode ter status Ativa, Depreciada, Inativa"))
            .Add(New Requisito("A Verificação ao ser Excluída deve receber o Porquê e o Usuário que exclui."))
            .Add(New Requisito("A Verificação ao ser Concluída, deve receber o Porquê e o Usuário que concluiu."))
            .Add(New Requisito("Uma Verificação deve poder ser reutilizada"))
            .Add(New Requisito("Por Verificação Ativa entende-se como sendo uma Verificação vigente dentro do escopo de qualidade do produto"))
            .Add(New Requisito("Por Verificação Depreciada entende-se como sendo uma Verificação que deverá ser adaptada, ou evoluída"))
            .Add(New Requisito("Por Verificação Inativa entende-se como uma Verificação que já fez parte do escopo de qualidade mas não faz mais"))
            .Add(New Requisito("Uma Análise é a união de uma Verificação feita por um Usuário e o ResultadoObservado"))
            .Add(New Requisito("Uma Análise possui dois estados: EmAberto, Concluida, Reaberto ou Excluída"))
            .Add(New Requisito("Uma Análise sem Usuário e sem ResultadoObservado deve ficar no estado EmAberto"))
            .Add(New Requisito("Ao receber um Usuário e o ResultadoObservado a Análise passa ao estado de Concluida"))
            .Add(New Requisito("Um Usuário pode reabrir uma Análise se dela não houver uma Conclusão compreensível. A Análise passa para status Reaberto"))
            .Add(New Requisito("A leitura de Reaberto é que haverá um retrabalho devido a falha na comunicação"))
            .Add(New Requisito("Uma lista de Análises no status de Concluída significa um trabalho de verificação da qualidade realizado"))
        End With


        _itemBackLog.Salvar()

        With _backlog.ItensPriorizados
            .Add(New ItemPriorizado(99, _itemBackLog))
        End With

        '-----------
        _itemBackLog = New ItemBackLog With {.Titulo = "Cadastro de Backlog", _
                             .EuComo = "Gestor de Projetos e Gestor de Qualidade", _
                             .Quero = "Cadastrar Backlog", _
                             .Para = "Agrupar itens de backlog"}

        _itemBackLog.Requisitos = New List(Of Requisito)

        With _itemBackLog.Requisitos
            .Add(New Requisito("Um Backlog deve possuir o Nome do Produto e a Descrição do Produto"))
            .Add(New Requisito("Um Backlog deve possuir uma lista de ItensPriorizados"))
            .Add(New Requisito("Um ItemPriorizado possui um Item de Backlog, a prioridade do Item, a Complexidade em numeral e o número de pontos que representa"))
            .Add(New Requisito("Um ItemPriorizado item priorizado quando cadastrado, por default possui prioridade 999"))
            .Add(New Requisito("Em um Backlog é possível adicionar ou remover um dado ItemPriorizado"))
            .Add(New Requisito("Um ItemPriorizado deve permitir a alteração da sua prioridade"))
            .Add(New Requisito("Um ItemPriorizado possui status de: NaoIniciado, EmAberto, EmAndamento, Impedido, Concluido"))
            .Add(New Requisito("Um ItemPriorizado deve possuir data de Início e Fim do Item, que podem ser preenchidas ou não"))
            .Add(New Requisito("Um ItemPriorizado pode ter impedimentos"))
            .Add(New Requisito("Um ItemPriorizado está Impedido quando possui um ou mais Impedimento(s) no estado EmAberto"))
            .Add(New Requisito("Um Impedimento deve ter Motivo, o autor que o registrou e a data e hora de registro"))
            .Add(New Requisito("Um Impedimento pode assumir estado de EmAberto e Resolvido"))
        End With


        _itemBackLog.Salvar()


        With _backlog.ItensPriorizados
            .Add(New ItemPriorizado(99, _itemBackLog))
        End With

        '---------
        _itemBackLog = New ItemBackLog With {.Titulo = "Cadastro de Item Backlog", _
                                     .EuComo = "Gestor de Projetos e Gestor de Qualidade", _
                                     .Quero = "Cadastrar projeto", _
                                     .Para = "Vincular todos os controles e artefatos produzidos ao decorrer dos projetos"}

        _itemBackLog.Requisitos = New List(Of Requisito)

        With _itemBackLog.Requisitos
            .Add(New Requisito("O modelo deve permitir o formato padrão de estórias, ou seja, identificar Eu, Como, Quero."))
            .Add(New Requisito("Todo Item Backlog deve pertencer a um ou mais Backlogs."))
            .Add(New Requisito("Todo Item Backlog deve possuir o Usuário que cadastrou e a Data e Hora que foi Cadastrado."))
        End With


        _itemBackLog.Salvar()

        With _backlog.ItensPriorizados
            .Add(New ItemPriorizado(99, _itemBackLog))
        End With

        '-----------
        _itemBackLog = New ItemBackLog With {.Titulo = "Cadastro de Cenários e Casos de Teste", _
                             .EuComo = "Gestor de Projetos e Gestor de Qualidade", _
                             .Quero = "Cadastrar Cenários e Casos de Teste", _
                             .Para = "Controlar todos os Cenários e Casos de Teste que contribuíram com a qualidade final do produto e acompanhar o andamento do projeto"}

        _itemBackLog.Requisitos = New List(Of Requisito)

        With _itemBackLog.Requisitos
            '.Add(New Requisito(""))
            .Add(New Requisito("Um CasoDeTeste pertence a um CenárioDeTeste"))
            .Add(New Requisito("Um CenarioDeTeste possui zero ou N Casos de Teste"))
            .Add(New Requisito("Um CenárioDeTeste possui um ItemBacklog que o originou"))
            .Add(New Requisito("Um CenárioDeTeste pode estar ligado a uma UI"))
        End With


        _itemBackLog.Salvar()


        With _backlog.ItensPriorizados
            .Add(New ItemPriorizado(99, _itemBackLog))
        End With

        '---------

        _backlog.Salvar()

        'Dim _itemBackLog02 As ItemBackLog

        '_itemBackLog02 = New ItemBackLog With {.Titulo = "Cadastro de Anúncio", _
        '                                     .EuComo = "Particular ou Lojista", _
        '                                     .Quero = "Cadastrar anúncios", _
        '                                     .Para = "expor no site"}


        '_itemBackLog02.Requisitos = New List(Of Requisito)

        'With _itemBackLog02.Requisitos
        '    .Add(New Requisito("Anúncio só será publicado se tiver crédito disponível"))
        '    .Add(New Requisito("Anúncio só será publicado se For usuário com perfil: Cliente ou Lojista"))
        '    .Add(New Requisito("Anúncio só será publicado se For aprovado pela moderação"))
        '    .Add(New Requisito("No caso de PF, poderá cadastrar até 3 ou 5 anuncios (definir)"))
        'End With

        '_itemBackLog02.Salvar()

        'Me.CargaInicial()

        Assert.IsTrue(_itemBackLog.Id.HasValue)

        '_verificacao = New Verificacao(_requisito, _usuario, _ui, _comentario, _status)
        '_verificacao = New Verificacao(_requisito, _usuario, _ui, _itens, _comentario, _status)

        '_implementacao = New Implementacao(_usuario, _verificacao)

        '_implementacao = New Implementacao(_usuario, _requisito)

    End Sub

    <Priority(10)> _
    <TestMethod()> _
    Public Sub SalvarItemPriorizado()

        Dim _ItemPriorizado As ItemPriorizado
        _ItemPriorizado = New ItemPriorizado

        _ItemPriorizado.Salvar()

        Assert.IsTrue(_ItemPriorizado.Id.HasValue)

    End Sub

    <Priority(10)> _
    <TestMethod()> _
    Public Sub SalvarImpedimento()

        Dim _Impedimento As Impedimento
        _Impedimento = New Impedimento

        _Impedimento.Salvar(_itemPriorizado:=New ItemPriorizado, _motivo:="motivo")

        Assert.IsTrue(_Impedimento.Id.HasValue)

    End Sub

End Class

